using System;

namespace Test.ConsoleProgram.Algorithm.Solution
{
    [TestDescription("算法: 0283. 移动零")]
    public class No0283_MoveZeroes : AbsBaseTestItem
    {
        /*
        给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
        说明:
            必须在原数组上操作，不能拷贝额外的数组。
            尽量减少操作次数。
        */

        public override void OnTest()
        {
            Func<int[], int[]> testFunc = (arrSource) =>
            {
                MoveZeroes(arrSource);
                return arrSource;
            };
            Assert.TestExe(testFunc,
                new int[] { 0, 1, 0, 3, 12 },
                new int[] { 1, 3, 12, 0, 0 });
        }

        public void MoveZeroes(int[] nums)
        {
            Action<int[], int, int> swap = (arr, left, right) =>
            {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            };
            int n = nums.Length;
            int left = 0; int right = 0;
            while (right < n)
            {
                if (nums[right] != 0)
                {
                    swap(nums, left, right);
                    left++;
                }
                right++;
            }
        }
    }
}
